/*
 * Bomberman.h
 *
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses 
 */

#ifndef BOMBERMAN_H_
#define BOMBERMAN_H_

#include "MovingObject.h"
#include "Properties.h"
#include "TimedBomb.h"

// Clase que modela a los bomberman

class Bomberman: public MovingObject {
private:
    int full_resistance;
    int lifes;
    int spawn_x;
    int spawn_y;
    int controling_player_id;
    int drop_frequency;
    int tics_since_drop;
    ModelObject representation;  /* Los bomberman guardan su representación,
                                  porque cada uno dentro de un juego tiene
                                  una diferente */

public:
    Bomberman(int x, int y);
    Bomberman(int controling_player_id, int x, int y);
    void setControlingPlayerId(int player_id);
    int getControlingPlayerId();
    // Se mueve, si la dirección de movimiento es distinto de NO_DIRECTION
    // Notifica el evento OBJECT_MOVED
    void move(Map& map);
    // Recibe la posición a la que desea moverse, y setea la dirección de
    // movimiento de manera que el bomberman se dirija a ese punto
    void movingTo(int x, int y);
    // Crea y devuelve, si puede, una nueva bomba
    TimedBomb* dropBomb();
    // Devuelve true al chocar con cualquier objeto que no sea otro bomberman,
    // en cuyo caso devuelve false
    bool getCollidedBy(MapObject* object);
    // Aplica el daño recibido al bomberman, y lo prepara para que sea
    // reinsertado (si le quedan vidas)
    // Notifica el evento OBJECT_DESTROYED
    void receiveDamage(int damage, MapObject* from);
    // Devuelve true si le quedan vidas, false en caso contrario
    bool canRevive();
    // Recupera puntos de resistencia. Si la cantidad es mayor a la
    // resistencia inicial o es -1 (valor por defecto), se recupera el total
    // de puntos de resistencia
    void restoreResistance(int amount = -1);
    Bomberman* clone();
    void setRepresentation(ModelObject representation);
    ModelObject getRepresentation();
private:
    void init();
};

#endif /* BOMBERMAN_H_ */
